#include "conver.h"


using std::vector;
using std::string;

convertor::convertor(){
    totalLine = 1;
    lineLimit = 0;
}

convertor::~convertor(){

}

/**
 * @brief 判断一行是否只包含空格和/或制表符
 * @param line 待检查的字符串
 * @return 如果全是空白字符返回 true，否则返回 false
 */
bool convertor::isWhitespaceOnly(const std::string& line){
    for(auto c:line)
        if(c != ' ' && c!= '\t')
            return false;

    return true;
}

/**
 * @brief 判断一行是否是 Allman 风格的左大括号行
 *        即该行只包含空格、制表符和一个单独的左大括号 '{'
 * @param line 待检查的字符串
 * @return 如果是 Allman 左大括号行返回 true，否则返回 false
 */
bool convertor::isAllmanLeftBraceLine(const std::string& line){
    std::string trimmed;
    for(auto c:line){
        if(c != ' ' && c!='\t')
            trimmed += c;
    }

    return trimmed == "{";
} 

/**
 * @brief 将 Allman 风格的代码转换为 K&R 风格
 * @param inputLines 输入的代码行向量
 * @return 转换后的代码行向量
 */


std::vector<std::string> convertor::convertAllmanToKnr(const std::vector<std::string>& inputLines) {
    std::vector<std::string> outputLines;
    bool pendingBrace = false; // 标记上一行是否需要追加左大括号

    for (const std::string& line : inputLines) {
        // 如果当前行是 Allman 风格的左大括号行
        if (isAllmanLeftBraceLine(line)) {
            pendingBrace = true; // 标记需要将 '{' 追加到上一行
            // 不将此行添加到输出，因为它将被合并
            continue;
        }

        // 如果有等待追加的左大括号，且当前行不是空白行
        if (pendingBrace && !isWhitespaceOnly(line)) {
            // 获取上一行（outputLines 的最后一行）
            if (!outputLines.empty()) {
                std::string& lastLine = outputLines.back();
                // 移除上一行末尾的空格（为了美观）
                while (!lastLine.empty() && (lastLine.back() == ' ' || lastLine.back() == '\t')) {
                    lastLine.pop_back();
                }
                // 追加空格和左大括号
                lastLine += " {";
            }
            pendingBrace = false; // 重置标记
        }

        // 将当前行添加到输出
        outputLines.push_back(line);
    }

    // 处理文件末尾的特殊情况：如果文件以 Allman 左大括号结尾且后面没有内容
    // 这种情况在实际代码中很少见，但为了健壮性
    if (pendingBrace) {
        if (!outputLines.empty()) {
            std::string& lastLine = outputLines.back();
            while (!lastLine.empty() && (lastLine.back() == ' ' || lastLine.back() == '\t')) {
                lastLine.pop_back();
            }
            lastLine += " {";
        }
    }

    return outputLines;
}

